Amazon Cognitoの招待メール、パスワードリセット メールを多言語化する
はじめに
私が担当しているシステムではユーザー認証にAWS Cognitoを使っています。システムを多言語化する計画があるため、Cognitoから送信されるメールを多言語化する方法を調べました。
前提
- Cognitoは サインアップ時とパスワードリセット時にコードの入ったメールが来ます。
- Cognitoのメールの文面はカスタムメッセージトリガーで作成しています。カスタムメッセージトリガーに関しては以下の記事をご覧ください。
CognitoのカスタムメッセージLambdaトリガーを使ってみた
サインアップとパスワードリセットの呼び出し
サインアップ、パスワードリセット時にAuthクラスのファンクションの呼び出しますが、これに言語の情報を含めるようにします。以下はTypescriptの例です。
サインアップの場合
navigator.language でブラウザの言語設定を取得します。Chromeで試したところ、日本語の場合は "ja" でした。この値をattributesのlocaleプロパティに入れます。
const param = { username: [メール名], password: [パスワード], attributes: { email: [メールアドレス], locale: navigator.language }, }; await Auth.signUp(param);
パスワードリセットの場合
パスワードリセットの場合は以下の例の様に forgotPassword の第2引数にlocaleを指定します。
await Auth.forgotPassword(username, { locale: navigator.language });
カスタムメッセージトリガー
カスタムメッセージトリガーのLambdaを実装します。日本語以外のlocaleが設定されていた場合は英語にしています。サインアップとパスワードリセットでそれぞれ日本語、英語のパターンがあるので4パターンあります。今回はPython3で実装してみました。
サインアップとパスワードリセットのメール本文はほぼ同じですが、コードの有効期限が違うため、そこだけ後から代入しています。サインアップは24時間でパスワードリセットは1時間です。有効期限は固定で変更できません。。
import os message_template_ja = '''<html> <head></head> <body> <p>コード:{{####}} </p> <p>※コードの有効期限は{limit}となります。</p> </body> </html> '''.strip() message_template_en = '''<html> <head></head> <body> <p>Your code is {{####}} </p> <br/> <p>* The code expires after {limit}.</p> </body> </html> '''.strip() def custom_message_create_handler(event, context): subject = None message_template = None limit = None if event['triggerSource'] == 'CustomMessage_SignUp': if event['request']['userAttributes']['locale'] == 'ja': # サインアップ 日本語の場合 subject='新規アカウント作成' message_template = message_template_ja limit='24時間' else: # サインアップ 英語の場合 subject='Registration Confirmation' message_template = message_template_en limit='24 hours' elif event['triggerSource'] == 'CustomMessage_ForgotPassword': if event['request']['clientMetadata']['locale'] == 'ja': # パスワードリセット 日本語の場合 subject='パスワードリセット' message_template = message_template_ja limit='1時間' else: # パスワードリセット 英語の場合 subject='Reset password' message_template = message_template_en limit='1 hour' message = message_template.format(limit=limit) event['response']['emailSubject'] = subject event['response']['emailMessage'] = message event['response']['smsMessage'] = message return event
最後に
調べたことは以上になります。もっといい方法があるかもしれませんが、目的は達成できました。最後まで読んでいただきありがとうございました。